<?php
//http://stackoverflow.com/questions/2046608/practical-zend-acl-zend-auth-implementation-and-best-practices

class Plugin_AccessCheck extends Zend_Controller_Plugin_Abstract {
    
    private $_auth;
    private $_acl;
    
    public function __construct(Zend_Acl $acl) {
        $this->_auth =  Zend_Auth::getInstance();
        $this->_acl = $acl;
    }
    
    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        $controllerName = $request->getControllerName();
        $actionName     = $this->getRequest()->getActionName();
 echo __FILE__;
        // Si el usuario esta autentificado
        if ($this->_auth->hasIdentity()) {
            // Si tiene autorización para el controlador
            if (!$this->isAllowed( $controllerName, $actionName) ) {
                // Mostramos el error de que no tiene permisos
                $request->setControllerName("error");
                $request->setActionName("deniedpermission");
            }
        } else {
            // El usuario no esta autentificado
            // Si el Usuario no esta identificado y no se dirige a la página de Login
            if ($controllerName != 'administracion') {
                // Mostramos al usuario el Formulario de Login
                $request->setControllerName("administracion");
                $request->setActionName("login");
            }
        }
    }
    
    private function getRol() {
        if ($this->_auth->hasIdentity()) {
            $data = $this->_auth->getIdentity();
            $Mod_R = new Model_Roles();
            $obj_R = $Mod_R->GetRolById($data->bibliotecario_rol_id);
            return $obj_R[0]['roles_nombre'];
        } else {
            return 'invitado';
        }
    }
    
    public function isAllowed ($resource, $permission = null) {
        // Por defecto, no tiene permisos
        $allow = false;
 
        // Si solo pregunta por el recurso
        if (is_null($permission)) {
            $allow = $this->_acl->isAllowed($this->getRol(), $resource);
        } else { // Si pregunta por el recurso y el permiso
            $allow = $this->_acl->isAllowed($this->getRol(), $resource, $permission);
        }
 
        return $allow;
    }
    
}

?>
